import asyncio
import random

import pygame

import cfg
from debug import debug
from dragon.barrier import Barrier
from dragon.dragon import Dragon
from units.uiUtil import playMyBgMusic, drawText, gameBgImg, Button

bg = pygame.image.load('dragon/img/myGameBg.jpg')
dragonImg = pygame.image.load('dragon/img/恐龙.png')
enemyImg = [pygame.image.load("dragon/img/仙人掌" + str(v) + ".png") for v in range(1, 5)]

class MainDragon:
    def __init__(self, dims, FPS=60):
        self.dims = dims
        self.FPS = FPS
        # 记录时间
        self.start_time = pygame.time.get_ticks()
        # 游戏运行控制变量（gamen_running）
        self.game_running = True
        # 得分
        self.score = 0
        self.enemyGroup = pygame.sprite.Group()
        self.dragon = Dragon(dragonImg, dims, (80,100), (100, dims[1]/2-100))
        # 游戏运行控制变量（gamen_running）
        self.game_running = True

    '''结束界面'''

    def endInterface(self, screen, score):
        if not self.game_running:
            # 显示得分
            drawText(f'最终得分{score}', "black", (250, 300), screen)

            # 画一个按钮，从新开始
            button_1 = Button(screen, (250, 500), '重新开始')

            # 画一个按钮，返回主菜单
            button_2 = Button(screen, (250, 700), '返回主菜单')

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    # sys.exit()
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if button_1.collidepoint(pygame.mouse.get_pos()):
                        self.score = 0
                        self.game_running = True
                    if button_2.collidepoint(pygame.mouse.get_pos()):
                        self.score = 0
                        self.goldSpritesGroup = pygame.sprite.Group()
                        self.game_running = True
                        cfg.inGame = False

    # 游戏主循环所在函数需要由 async 定义
    async def start(self):
        # 初始化游戏界面（screen）：尺寸、背景色等
        screen = pygame.display.set_mode(self.dims)
        # 显示游戏名称
        pygame.display.set_caption("跳跳龙")
        # 初始化游戏时钟（clock），由于控制游戏帧率
        clock = pygame.time.Clock()
        # 播放背景音乐
        playMyBgMusic('assets/music/bg3.mp3')

        temp = -1

        # 游戏主循环
        while cfg.inGame:
            # 按照给定的 FPS 刷新游戏
            # clock.tick() 函数返回上一次调用该函数后经历的时间，单位为毫秒 ms
            # dt 记录上一帧接受之后经历的时间，单位为秒 m
            # 使用 dt 控制物体运动可以使游戏物理过程与帧率无关
            dt = clock.tick(self.FPS) / 1000.0
            # 使用 asyncio 同步
            # 此外游戏主体代码中不需要再考虑 asyncio
            await asyncio.sleep(0)

            # 游戏事件处理
            # 包括键盘、鼠标输入等
            for event in pygame.event.get():
                # 点击关闭窗口按钮或关闭网页
                if event.type == pygame.QUIT:
                    pygame.quit()
                # 当 game_running 为 False 时，
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE and self.dragon.jumped is False:
                        self.dragon.jumped = True

            # 更新背景
            gameBgImg(screen, bg, 0, self.dims)
            # 调用 debug 函数在游戏界面左上角显示游戏帧率
            debug(f"{clock.get_fps():.1f}", color='green')
            # 显示得分
            drawText(f"得分：{self.score}", "black", (100, 100), screen)

            # 清空所有红包
            if not self.game_running:
                temp = -1
                self.enemyGroup = pygame.sprite.Group()
                self.endInterface(screen, self.score)

            if self.game_running:
                # 屏幕中间画一条线
                pygame.draw.line(screen,"black", (0, self.dims[1]/2), (self.dims[0], self.dims[1]/2))
                # 仙人掌精灵或者鸟精灵
                temp -=1
                if temp <0:
                    temp = random.randint(150,250)
                    self.enemyGroup.add(Barrier(enemyImg[random.randint(0,3)],self.dims,(50,80),(self.dims[0],self.dims[1]/2-80)))
                # 更新位置，将移除屏幕的精灵删除
                for enemy in self.enemyGroup:
                    if not enemy.update():
                        self.enemyGroup.remove(enemy)
                        # 消失一个记一分
                        self.score += 1
                # 绘制障碍物精灵
                self.enemyGroup.draw(screen)
                # 画出跳跳龙
                self.dragon.update()
                self.dragon.draw(screen)
                # 碰撞检测
                for enemy in self.enemyGroup:
                    if pygame.sprite.collide_mask(enemy, self.dragon):
                        # 发生碰撞，游戏结束
                        self.game_running = False


            # 将游戏界面内容输出至屏幕
            pygame.display.update()

            # 跳出游戏主循环，退出游戏
        cfg.inGame = False